#include <iostream>
#include <string.h>
#include <exception>
#include <list>

using namespace std;

class test
{
public:
    bool operator()(int x)
    {
        if (x == 10)
        {
            return true;
        }
        return false;
    }
};

int main()
{
    //////////////////////////////构造函数的使用////////////////////////////////////////
    list<int> l1(3, 2);
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(30);

    list<int>::iterator it = l1.begin();
    it++;

    list<int> l2(it, l1.end());
    //    l1.begin()返回链表第一个元素的迭代器
    //    l1.end() 返回最后一个元素的下一个元素，结束标记

    for (list<int>::iterator it = l2.begin(); it != l2.end(); it++)
    {
        cout << "l2:" << *it << endl;
    }

    cout << "///////////////////////////////修改链表值/////////////////////////////////////" << endl;
    l1.assign(l2.begin(), l2.end());
    for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
    {
        cout << "l1:" << *it << endl;
    }

    cout << "///////////////////////////////返回L1最后一个元素/////////////////////////////////////" << endl;
    int &x = l1.back(); // 返回链表的最后一个元素的引用
    x = 1000;
    cout << l1.back() << endl;

    cout << "///////////////////////////////erase删除第一个元素/////////////////////////////////////" << endl;
    // erase参数需要的是一个迭代器
    it = l1.erase(l1.begin()); // 删除第一个元素并返回新的第一个元素的迭代器
    it = l1.erase(l1.begin()); // 删除第一个元素并返回新的第一个元素的迭代器
    cout << "新的元素是：" << *it << endl;

    //    l1.erase(l1.begin(),l1.end());//全部删除， 相当于调用了clear函数

    for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
    {
        cout << "l1:" << *it << endl;
    }

    cout << "///////////////////////////////insert元素/////////////////////////////////////" << endl;

    it = l1.begin();
    it++;
    l1.insert(it, 1000);                 // 往迭代器的位置插入一个数值
    l1.insert(it, l2.begin(), l2.end()); // 往迭代器的位置插入一段链表
    for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
    {
        cout << "l1:" << *it << endl;
    }
    cout << "///////////////////////////////返回front和back元素/////////////////////////////////////" << endl;
    cout << "l1.front():" << l1.front() <<" "<<"l1.back():" << l1.back()<<endl;
    l1.front() = 1000; // 修改第一个元素的值
    l1.back() = 2000; // 修改最后一个元素的值
    cout << "l1.front():" << l1.front() <<" "<<"l1.back():" << l1.back()<<endl;
    
    cout << "///////////////////////////////合并链表/////////////////////////////////////" << endl;
    cout << "l1:";
    for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
    cout << "l2:";
    for (list<int>::iterator it = l2.begin(); it != l2.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    l1.merge(l2);
    l1.sort();
    cout << "l1:";
    for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    cout << "///////////////////////////////逆向迭代器/////////////////////////////////////" << endl;

    list<int>::reverse_iterator rit = l1.rbegin(); // rbegin返回链表的最后一个元素，反向第一个
    cout << "反向输入l1 ";
    for (; rit != l1.rend(); rit++)
    {
        cout << *rit << " ";
    }
    cout << endl;

    cout << "///////////////////////////////remove删除元素/////////////////////////////////////" << endl;
    l1.remove(1000); // 删除值为1000的元素
    test t1;   // 定义一个结构体
    l1.remove_if(t1);  // 删除满足条件的元素
    cout << "l1:";
    for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    cout << "///////////////////////////////去重元素/////////////////////////////////////" << endl;
    l1.unique();
    cout << "l1:";
    for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}
